const AuthService = require('../services/auth.service');
const PasswordResetService = require('../services/password-reset.service');
const Response = require('../utils/response');
const logger = require('../utils/logger');

// 错误码定义
const ErrorCodes = {
  PARAMS_INVALID: 400,        // 参数无效
  UNAUTHORIZED: 401,          // 未授权
  FORBIDDEN: 403,            // 禁止访问
  NOT_FOUND: 404,            // 资源不存在
  SERVER_ERROR: 500          // 服务器内部错误
};

class AuthController {
  /**
   * 用户登录
   */
  static async login(req, res) {
    try {
      const { username, password } = req.body;

      // 验证参数
      if (!username || !password) {
        return res.json(Response.error('参数无效：用户名和密码不能为空', ErrorCodes.PARAMS_INVALID));
      }

      // 获取客户端信息
      const clientInfo = {
        ip: req.ip,
        userAgent: req.get('user-agent')
      };

      // 调用登录服务
      const result = await AuthService.login(username, password, clientInfo);
      
      return res.json(Response.success(result));
    } catch (error) {
      logger.error('登录失败:', error);
      // 根据错误类型返回对应的错误码
      if (error.message.includes('secretOrPrivateKey must have a value')) {
        return res.json(Response.error('系统配置错误：JWT密钥未设置', ErrorCodes.SERVER_ERROR));
      }
      if (error.message.includes('用户名或密码错误')) {
        return res.json(Response.error(error.message, ErrorCodes.UNAUTHORIZED));
      }
      return res.json(Response.error(error.message, ErrorCodes.SERVER_ERROR));
    }
  }

  /**
   * 请求密码重置
   */
  static async requestPasswordReset(req, res) {
    try {
      const { email } = req.body;
      
      if (!email) {
        return res.json(Response.error('参数无效：邮箱不能为空', ErrorCodes.PARAMS_INVALID));
      }

      const result = await PasswordResetService.generateResetToken(email);
      
      // TODO: 发送重置邮件
      logger.info('密码重置邮件已发送:', result);

      return res.json(Response.success(null, '重置链接已发送到您的邮箱'));
    } catch (error) {
      logger.error('请求密码重置失败:', error);
      if (error.message.includes('用户不存在')) {
        return res.json(Response.error(error.message, ErrorCodes.NOT_FOUND));
      }
      return res.json(Response.error('密码重置请求失败', ErrorCodes.SERVER_ERROR));
    }
  }

  /**
   * 验证重置令牌
   */
  static async verifyResetToken(req, res) {
    try {
      const { token } = req.params;
      
      if (!token) {
        return res.json(Response.error('参数无效：重置令牌不能为空', ErrorCodes.PARAMS_INVALID));
      }

      await PasswordResetService.verifyResetToken(token);
      return res.json(Response.success(null, '重置令牌有效'));
    } catch (error) {
      logger.error('验证重置令牌失败:', error);
      return res.json(Response.error('重置令牌无效或已过期', ErrorCodes.UNAUTHORIZED));
    }
  }

  /**
   * 重置密码
   */
  static async resetPassword(req, res) {
    try {
      const { token } = req.params;
      const { password } = req.body;
      
      if (!token || !password) {
        return res.json(Response.error('参数无效：重置令牌和新密码不能为空', ErrorCodes.PARAMS_INVALID));
      }

      await PasswordResetService.resetPassword(token, password);
      return res.json(Response.success(null, '密码重置成功'));
    } catch (error) {
      logger.error('重置密码失败:', error);
      if (error.message.includes('重置令牌无效')) {
        return res.json(Response.error(error.message, ErrorCodes.UNAUTHORIZED));
      }
      return res.json(Response.error('密码重置失败', ErrorCodes.SERVER_ERROR));
    }
  }

  /**
   * 用户登出
   */
  static async logout(req, res) {
    try {
      await AuthService.logout(req.user.id);
      return res.json(Response.success(null, '登出成功'));
    } catch (error) {
      logger.error('登出失败:', error);
      return res.json(Response.error('登出失败', ErrorCodes.SERVER_ERROR));
    }
  }

  /**
   * 刷新访问令牌
   */
  static async refreshToken(req, res) {
    try {
      const { refreshToken } = req.body;
      
      if (!refreshToken) {
        return res.json(Response.error('参数无效：刷新令牌不能为空', ErrorCodes.PARAMS_INVALID));
      }

      const result = await AuthService.refreshToken(refreshToken);
      return res.json(Response.success(result));
    } catch (error) {
      logger.error('刷新令牌失败:', error);
      if (error.name === 'TokenExpiredError') {
        return res.json(Response.error('刷新令牌已过期', ErrorCodes.UNAUTHORIZED));
      }
      return res.json(Response.error('刷新令牌无效', ErrorCodes.UNAUTHORIZED));
    }
  }
}

module.exports = AuthController; 